#include <iostream>
#include <fstream>

using namespace std;

/*
 * 文件类型
 *      文本文件    以ASCII码形式储存
 *      二进制文件   以二进制形式储存
 *  操作文件三大类
 *      ofstream    写操作
 *      ifstream    读操作
 *      fstream     读写操作
 *   文件的打开方式
 *      ios::in     读文件
 *      ios::out    写文件
 *      ios::ate    文件尾
 *      ios::app    追加
 *      ios::trunc  若文件存在，先删除，再创建
 *      ios::binary 二进制方式
 *     多个方式相互配合使用 | 分隔
 *  写文件步骤
 *      1、包含头文件
 *          #include <fstream>
 *      2、创建流对象
 *          ofstream ofs;
 *      3、打开文件
 *          ofs.open("文件路径", 打开方式);
 *      4、写数据
 *          ofs << "写入的数据";
 *      5、关闭文件
 *          ofs.close();
 *
 *  读文件步骤
 *      1、包含头文件
 *          #include <fstream>
 *      2、创建流对象
 *          ifstream ifs;
 *      3、打开文件,并判断是否打开成功
 *          ifs.open("文件路径", 打开方式);
 *      4、读数据
 *          四种方式读取
 *      5、关闭文件
 *          ifs.close();
 * 
 *  linux 进程默认打开了三个文件描述符 
 *      0： 标准输入  键盘      cin
 *      1：标注输出   显示器    cout
 *      2：标准错误   显示器    cerr
 *      可以使用close()关闭该文件描述符  close(0); ...
 */

void test01(){
    ofstream ofs;
    ofs.open("test.txt", ios::out);
    ofs << "姓名:张三\n";
    ofs << "性别:男" << endl;
    ofs << "年龄:18\n";
    ofs.close();
}

void test02(){
    ifstream ifs;
    ifs.open("test.txt", ios::in);
    //判断文件是否打开
    if(!ifs.is_open()){
        cout << "文件打开失败!" << endl;
        return;
    }
//    //第一种读取方式
//    char buf[1024] = {0};
//    while (ifs >> buf) {
//        cout << buf << endl;
//    }

//    //第二种读取方式
//    char buf[1024] = {0};
//    while (ifs.getline(buf, sizeof(buf))) {
//        cout << buf << endl;
//    }

//    //第三种读取方式
//    string buf;
//    while (getline(ifs, buf)) {
//        cout << buf << endl;
//    }

    //第四种读取方式
    char c;
    while ((c = ifs.get()) != EOF) {  // EOF  end of file
        cout << c;
    }

    ifs.close();
}

int main() {

//    test01();

    test02();
    return 0;
}
